Robot car is controlled by a smartphone through wi-fi

Click Here to View Step by Step

This robot car is controlled by a smartphone through wi-fi, and 18650 battery charging I have attached everything with this instructable with an explanation

 

Hardware components for Battery  charging  :
1 X 3S 18650 Li-po Lithium Battery Capacity Indicator Module
3 X Battery 18650
3 X Battery Holder
1 X Female DC Power (2.1mm) Plastic Connector for Box DC-022
1 X BMS 3S 18650 Lithium Battery Protection Board (10A)

Other Hardware components :

1 X NodeMCU 8266
1 X L298 Motor Driver Module
2 X LED Red (1W)
2 X LED White (1W)
1 X Breadboard Solderless 170
1 X DC Brushless Fan
4 X Robot Car Wheel Tyre (65mm)
4 X Robot Smart Car DC Motor

1 X Plastic Project Box NFN.183 (190 (L) x 120 (W) x 60 (H) mm)

 

Code

#define ENA   14          // Enable/speed motors Right        GPIO14(D5)
#define ENB   12          // Enable/speed motors Left          GPIO12(D6)
#define IN_1  4            // L298N in1 motors Right              GPIO15(D2)
#define IN_2  13          // L298N in2 motors Right              GPIO13(D7)
#define IN_3  2           // L298N in3 motors Left                 GPIO2(D4)
#define IN_4  0           // L298N in4 motors Left                 GPIO0(D3)
#define front_light  15   
#define red_light  5           //back
#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>
String command;             //String to store app command state.
int speedCar = 800;         // 400 - 1023.
int speed_Coeff = 3;
const char* ssid = "ABbkareno Wifi"; //wifi name
ESP8266WebServer server(80);
void setup() {
 
 pinMode(ENA, OUTPUT);
 pinMode(ENB, OUTPUT);  
 pinMode(IN_1, OUTPUT);
 pinMode(IN_2, OUTPUT);
 pinMode(IN_3, OUTPUT);
 pinMode(IN_4, OUTPUT); 
  pinMode(IN_4, OUTPUT); 
   pinMode(red_light, OUTPUT); 
    pinMode(front_light, OUTPUT); 
   
  
  Serial.begin(115200);
  
// Connecting WiFi   WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid);
IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
 
 // Starting WEB-server 
     server.on ( "/", HTTP_handleRoot );
     server.onNotFound ( HTTP_handleRoot );
     server.begin();    
}

void goAhead(){ 
digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, HIGH);
      analogWrite(ENA, speedCar);
digitalWrite(red_light, LOW);
      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, HIGH);
      analogWrite(ENB, speedCar);
  
 digitalWrite(front_light, HIGH);    
  }
void goBack(){ 
digitalWrite(red_light, HIGH);
digitalWrite(front_light,LOW );    
      digitalWrite(IN_1, HIGH);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar);
digitalWrite(IN_3, HIGH);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar);
  }
void goRight(){ 
digitalWrite(front_light,LOW );      
digitalWrite(red_light, HIGH);
      digitalWrite(IN_1, HIGH);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar);
      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, HIGH);
      analogWrite(ENB, speedCar);
  }
void goLeft(){
  digitalWrite(front_light,LOW );    
digitalWrite(red_light, HIGH);
      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, HIGH);
      analogWrite(ENA, speedCar);
      digitalWrite(IN_3, HIGH);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar);
  }
void goAheadRight(){
      digitalWrite(front_light,LOW );    
      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, HIGH);
      analogWrite(ENA, speedCar/speed_Coeff);
 digitalWrite(red_light, HIGH);
      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, HIGH);
      analogWrite(ENB, speedCar);
   }
void goAheadLeft(){
  digitalWrite(front_light,LOW );    
      digitalWrite(red_light, HIGH);
      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, HIGH);
      analogWrite(ENA, speedCar);
      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, HIGH);
      analogWrite(ENB, speedCar/speed_Coeff);
  }
void goBackRight(){ 
  digitalWrite(front_light,LOW );    
digitalWrite(red_light, HIGH);
      digitalWrite(IN_1, HIGH);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar/speed_Coeff);
      digitalWrite(IN_3, HIGH);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar);
  }
void goBackLeft(){ 
  digitalWrite(front_light,LOW );    
digitalWrite(red_light, HIGH);
      digitalWrite(IN_1, HIGH);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar);
      digitalWrite(IN_3, HIGH);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar/speed_Coeff);
  }
void stopRobot(){  
digitalWrite(red_light, LOW);
      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar);
digitalWrite(front_light,LOW );    
      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar);
 }
void loop() {
    server.handleClient();
    
      command = server.arg("State");
      if (command == "F") goAhead();
      else if (command == "B") goBack();
      else if (command == "L") goLeft();
      else if (command == "R") goRight();
      else if (command == "I") goAheadRight();
      else if (command == "G") goAheadLeft();
      else if (command == "J") goBackRight();
      else if (command == "H") goBackLeft();
      else if (command == "0") speedCar = 400;
      else if (command == "1") speedCar = 470;
      else if (command == "2") speedCar = 540;
      else if (command == "3") speedCar = 610;
      else if (command == "4") speedCar = 680;
      else if (command == "5") speedCar = 750;
      else if (command == "6") speedCar = 820;
      else if (command == "7") speedCar = 890;
      else if (command == "8") speedCar = 960;
      else if (command == "9") speedCar = 1023;
      else if (command == "S") stopRobot();
}
void HTTP_handleRoot(void) {
if( server.hasArg("State") ){
       Serial.println(server.arg("State"));
  }
  server.send ( 200, "text/html", "" );
  delay(1);
}